package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.common.R;
import com.itheima.reggie.dto.DishDto;
import com.itheima.reggie.entity.Category;
import com.itheima.reggie.entity.Dish;
import com.itheima.reggie.entity.DishFlavor;
import com.itheima.reggie.service.CategoryService;
import com.itheima.reggie.service.DishFlavorService;
import com.itheima.reggie.service.DishService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 菜品管理
 */
@RestController
@Slf4j
@RequestMapping("/dish")
public class DishController {
    private DishService dishService;
    private DishFlavorService dishFlavorService;
    @Autowired
    public DishController(DishService dishService,DishFlavorService dishFlavorService){
        this.dishService=dishService;
        this.dishFlavorService=dishFlavorService;
    }
    @Autowired
    private CategoryService categoryService;

@PostMapping
    public R<String> save(@RequestBody DishDto dishDto){
        log.info(dishDto.toString());
dishService.saveWithFlavor(dishDto);
        return R.success("新增菜品成功");
}

@GetMapping("/page")
    public R<Page> page (int page,int pageSize,String name){
        //构造分页构造器对象
    Page<Dish> pageInfo=new Page(page,pageSize);

    Page<DishDto> dishDtoPage=new Page<>();
    LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.like(name!=null,Dish::getName,name);
    queryWrapper.orderByDesc(Dish::getUpdateTime);
    dishService.page(pageInfo,queryWrapper);

    BeanUtils.copyProperties(pageInfo,dishDtoPage,"records");
    List<Dish> records = pageInfo.getRecords();
    List<DishDto> list =
        records.stream().map(
                (item) -> {
                  DishDto dishDto = new DishDto();
                  BeanUtils.copyProperties(item, dishDto);
                  Long categoryId = item.getCategoryId();
                  Category category = categoryService.getById(categoryId);
                  if (category != null) {
                    String categoryName = category.getName();
                    dishDto.setCategoryName(categoryName);
                  }
                  return dishDto;
                })
            .collect(Collectors.toList());

    dishDtoPage.setRecords(list);

    return R.success(dishDtoPage);
}
@GetMapping("/{id}")
    public R<DishDto> get(@PathVariable Long id){
//查询当前菜品对应的口味信息
    DishDto dishDto = dishService.getByIdWithFlavor(id);
        return R.success(dishDto);
}

@PutMapping
    public R<String> update(@RequestBody DishDto dishDto){
        log.info(dishDto.toString());
        dishService.updateWithFlavor(dishDto);
        return R.success("更新菜品成功");
    }
/*@GetMapping("/list")
    public R<List<Dish>> list(Dish dish){
    LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.eq(dish.getCategoryId()!=null,Dish::getCategoryId,dish.getCategoryId());
    queryWrapper.eq(Dish::getStatus,1);
    queryWrapper.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);
    List<Dish> list = dishService.list(queryWrapper);
    return  R.success(list);
}
*/
@GetMapping("/list")
public R<List<DishDto>> list(Dish dish){
    LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.eq(dish.getCategoryId()!=null,Dish::getCategoryId,dish.getCategoryId());
    queryWrapper.eq(Dish::getStatus,1);
    queryWrapper.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);
    List<Dish> list = dishService.list(queryWrapper);
    List<DishDto> dishDtoList =
        list.stream().map(
                            (item) -> {
                                DishDto dishDto = new DishDto();
                                BeanUtils.copyProperties(item, dishDto);
                                Long categoryId = item.getCategoryId();
                                Category category = categoryService.getById(categoryId);
                                if (category != null) {
                                    String categoryName = category.getName();
                                    dishDto.setCategoryName(categoryName);
                                }
                                Long dishid = item.getId();
                                LambdaQueryWrapper<DishFlavor> lambdaqueryWrapper = new LambdaQueryWrapper<>();
                                lambdaqueryWrapper.eq(DishFlavor::getDishId,dishid);
                                List<DishFlavor> dishFlavorList = dishFlavorService.list(lambdaqueryWrapper);
                                dishDto.setFlavors(dishFlavorList);
                                return dishDto;
                            })
                    .collect(Collectors.toList());

    return  R.success(dishDtoList);
}
}
